/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import dao.DepartamentoJpaController;
import dao.GrupoUsuarioJpaController;
import dao.UsuarioJpaController;
import dao.exceptions.NonexistentEntityException;
import dominio.DepartamentoMd;
import dominio.GrupoUsuarioMd;
import dominio.UsuarioMd;
import java.io.File;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import util.Controlador;
import util.IntranetUtil;
import util.NivelAcesso;
import util.Resposta;
import util.Seguranca;

/**
 *
 * @author Bughi
 */
public class UsuarioCt extends Controlador {

    UsuarioJpaController dao;
    GrupoUsuarioJpaController daoGrupo;
    DepartamentoJpaController daoDepartamento;

    public UsuarioCt(HttpServletRequest request, HttpServletResponse response, ServletContext contexto) {
        super(request, response, contexto);
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranetJPU");
        dao = new UsuarioJpaController(emf);
        daoGrupo = new GrupoUsuarioJpaController(emf);
        daoDepartamento = new DepartamentoJpaController(emf);

    }  

    public void login() {       

        this.resposta.definirResposta("visao/login.jsp", Resposta.TipoResposta.encaminhamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void jsonevento() {       

        this.resposta.definirResposta("visao/json-evento.jsp", Resposta.TipoResposta.encaminhamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void home() {
        this.resposta.definirResposta("visao/home.jsp", Resposta.TipoResposta.encaminhamento);
    }

    public void autenticar() {
              
        UsuarioMd usuario;
        String login = this.getParameterValue("login");
        //String senha = IntranetUtil.criptografa(this.getParameterValue("senha"));
        String senha = this.getParameterValue("senha");
        usuario = dao.login(login, senha);

        if (usuario != null) {
            this.resposta.adicionarAtributo("usuario", usuario, Resposta.EscopoAtributo.sessao);
            this.resposta.definirResposta("home", Resposta.TipoResposta.redirecionamento);

        } else {
            this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
        }
    }

    public void logoff() {
        this.resposta.adicionarAtributo("usuario", null, Resposta.EscopoAtributo.sessao);
        this.resposta.definirResposta("login", Resposta.TipoResposta.redirecionamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR})
    public void listar() {
        List<UsuarioMd> usuarios;
        String filtro = this.getParameterValue("filtro");
        if (filtro != null) {
            usuarios = dao.findUsuarioEntities(filtro);
        } else {
            usuarios = dao.findUsuarioEntities();
        }

        Collections.sort(usuarios);

        this.resposta.adicionarAtributo("usuarios", usuarios, Resposta.EscopoAtributo.requisicao);
        this.resposta.adicionarAtributo("filtrousuario", filtro, Resposta.EscopoAtributo.requisicao);
        this.resposta.definirResposta("visao/usuarioLista.jsp", Resposta.TipoResposta.encaminhamento);
    }

    @Seguranca(nivel ={NivelAcesso.ADMINISTRADOR})
    public void confirmar() {
        UsuarioMd usuario;
        boolean edicao = false;
        if (this.getParameterValue("id") != null) {
            //edicao
            edicao = true;
            usuario = dao.findUsuario(Long.parseLong(this.getParameterValue("id")));
        } else {
            //novo
            usuario = new UsuarioMd();
        }

        usuario.setLogin(this.getParameterValue("login").toLowerCase());
        //usuario.setSenha(IntranetUtil.criptografa(this.getParameterValue("senha")));
        usuario.setSenha(this.getParameterValue("senha"));
        usuario.setNome(this.getParameterValue("nome").toUpperCase());
        usuario.setSobrenome(this.getParameterValue("sobrenome").toUpperCase());
        usuario.setEmail(this.getParameterValue("email").toLowerCase());

        if (this.getParameterValue("datanascimento") != null){
            Date dataNascimento = IntranetUtil.dataSimples(this.getParameterValue("datanascimento"));
            usuario.setDataNascimento(dataNascimento);
        }
        usuario.setGrupo(daoGrupo.findGrupoUsuario(Long.parseLong(this.getParameterValue("grupo"))));
        usuario.setDepartamento(daoDepartamento.findDepartamento(Long.parseLong(this.getParameterValue("departamento"))));

        if (usuario.getNome().length() < 3) {
            this.resposta.adicionarErro("nome", "Nome deve conter no mínimo 3 caracteres.");
        }

        if (usuario.getSobrenome().isEmpty()) {
            this.resposta.adicionarErro("sobrenome", "Informe o sobrenome");
        }

        FileItem fi = this.getUploadedFile("foto");
        if (fi != null && fi.getSize() > 0) {
            String path = this.contexto.getRealPath(this.contexto.getInitParameter("foto-upload")) + "/";
            try {
                File file;
                String fileName = fi.getName();
                String relativeFileName;
                if (fileName.lastIndexOf("\\") >= 0) {
                    file = new File(path + fileName.substring(fileName.lastIndexOf("\\")));
                    relativeFileName = this.contexto.getInitParameter("foto-upload") + "/" + fileName.substring(fileName.lastIndexOf("\\"));
                } else {
                    file = new File(path + fileName.substring(fileName.lastIndexOf("\\") + 1));
                    relativeFileName = this.contexto.getInitParameter("foto-upload") + "/" + fileName.substring(fileName.lastIndexOf("\\") + 1);
                }
                fi.write(file);
                usuario.setCaminhoFoto(relativeFileName);
            } catch (Exception e) {
                this.resposta.adicionarErro("foto", e.getMessage());
            }
        }

        if (edicao) {
            try {
                if (this.resposta.existeErro()) {
                    throw new Exception("Corrigir os erros");
                }
                dao.edit(usuario);
                this.resposta.definirResposta("listar", Resposta.TipoResposta.redirecionamento);
            } catch (Exception ex) {
                this.resposta.adicionarErro("geral", "Erro: " + ex.getMessage());
                this.resposta.adicionarAtributo("usuario", usuario, Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("id", this.getParameterValue("id"), Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("grupos", usuario.getGrupo(), Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("departamentos", usuario.getDepartamento(), Resposta.EscopoAtributo.requisicao);
                this.resposta.definirResposta("visao/usuarioCadastro.jsp", Resposta.TipoResposta.encaminhamento);
            }
        } else {
            try {
                if (this.resposta.existeErro()) {
                    throw new Exception("Corrigir os erros");
                }
                dao.create(usuario);
                this.resposta.definirResposta("listar", Resposta.TipoResposta.redirecionamento);
            } catch (Exception ex) {
                this.resposta.adicionarErro("geral", "Erro: " + ex.getMessage());
                this.resposta.adicionarAtributo("usuario", usuario, Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("grupos", usuario.getGrupo(), Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("departamentos", usuario.getDepartamento(), Resposta.EscopoAtributo.requisicao);
                this.resposta.definirResposta("visao/usuarioCadastro.jsp", Resposta.TipoResposta.encaminhamento);

            }
        }
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR})
    public void editar() {
        if (this.getParameterValue("id") != null) {
            UsuarioMd usuario = dao.findUsuario(Long.parseLong(this.getParameterValue("id")));
            List<GrupoUsuarioMd> grupos = daoGrupo.findGrupoUsuarioEntities();
            List<DepartamentoMd> departamentos = daoDepartamento.findDepartamentoEntities();

            this.resposta.adicionarAtributo("usuario", usuario, Resposta.EscopoAtributo.requisicao);
            this.resposta.adicionarAtributo("id", usuario.getId(), Resposta.EscopoAtributo.requisicao);
            this.resposta.adicionarAtributo("grupos", grupos, Resposta.EscopoAtributo.requisicao);
            this.resposta.adicionarAtributo("departamentos", departamentos, Resposta.EscopoAtributo.requisicao);
            this.resposta.definirResposta("visao/usuarioCadastro.jsp", Resposta.TipoResposta.encaminhamento);
        } else {
            this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
        }
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR})
    public void excluir() {
        Long id = Long.parseLong(this.getParameterValue("id"));
        try {
            dao.destroy(id);
        } catch (NonexistentEntityException ex) {
            System.out.println(ex.getMessage());
        }
        this.resposta.definirResposta("listar", Resposta.TipoResposta.redirecionamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR})
    public void incluir() {
        this.resposta.adicionarAtributo("usuario", new UsuarioMd(), Resposta.EscopoAtributo.requisicao);
        List<GrupoUsuarioMd> grupos = daoGrupo.findGrupoUsuarioEntities();
        List<DepartamentoMd> departamentos = daoDepartamento.findDepartamentoEntities();
        this.resposta.adicionarAtributo("grupos", grupos, Resposta.EscopoAtributo.requisicao);
        this.resposta.adicionarAtributo("departamentos", departamentos, Resposta.EscopoAtributo.requisicao);
        this.resposta.definirResposta("visao/usuarioCadastro.jsp", Resposta.TipoResposta.encaminhamento);
    }

    public void padrao() {
        this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
    }
}
